//
//  XGUserAccountViewModel.swift
//  WeIBo
//
//  Created by 苏文潇 on 2017/3/8.
//  Copyright © 2017年 苏文潇. All rights reserved.
//

import UIKit

class XGUserAccountViewModel: NSObject {

    static let sharedUserAccount: XGUserAccountViewModel = XGUserAccountViewModel()
    
//    MARK: 是否登录的判断
    var isLogin: Bool {
        
        return accessToken != nil
        
    }
    
//  MARK: 拿到用户模型
    var userAccount: XGTokenUserAccount? {
        
        return XGTokenUserAccount.loadUserAccount()
    }
    
    var accessToken: String? {
        
        guard let token = userAccount?.access_token else{
            return nil
        }
        
//        代码执行到此说名token值存在，然后在判断token值是否过期
        if userAccount?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending
        {
            return token
        }
        else
        {
            //过期了
            return nil
        }
        
    }
    
    //    MARK:通过code获取accessToken值
    //    private 表示更加私有， 在扩展里面也不能访问  swift 3.0
    //    fileprivate 表示私有，但是可以在扩展里面访问
    func requestAccessToken(code: String, callBack: @escaping (Bool)->())
    {
        XGAFNetworkingTools.sharedTools.OAuthLoad(code: code, callBack: {(response, error) -> () in
            if (error != nil) {
                print(error!)
                callBack(false)
                return
            }
            //            代码执行到此，说明有数据
            //            print(response!)
            let dic = response as! [String: Any]
            
            let userAccount = XGTokenUserAccount(dic: dic)
            
            self.requsetUserInfo(userAccount: userAccount,callBack: callBack)
        })
    }
    
    //    MARK: 通过uid和access_token获取用户信息
//    设置两个闭包目的就是这里的参数直到下面这个方法完成之后才会获取到用户的信息，因此要想外界直到是否获取成功就需要在这里在传递一个值即可
    private func requsetUserInfo(userAccount: XGTokenUserAccount, callBack: @escaping (Bool)->()){
        
        let accessToken = userAccount.access_token!
        let uid = userAccount.uid
        
        XGAFNetworkingTools.sharedTools.requestUserMessage(accessToken: accessToken, uid: uid, callBack: {(response, error) -> () in
            
            if error != nil {
                print(error!)
                callBack(false)
                return
            }
            
            //            print(response)
            let dic = response as! [String: Any]
//  注意这里不能再次使用同一个模型中的字典转模型，会出大事的。如果想使用字典转模型的话在添加一个模型即可。这里是为了省事都添加到了一个模型中。
//            let userInfo = XGTokenUserAccount(dic: dic)  //这句代码千万不能在这里用
//            print(userInfo.name!,  userInfo.avatar_large!)
            
//            取到response中的name，目的是给模型进行赋值
            let name: String = dic["name"] as! String
//            取到response中的avatar_large，目的是给模型进行赋值
            let avatar_large: String = dic["avatar_large"] as! String
            
//            给模型中的属性进行赋值
            userAccount.name = name
            userAccount.avatar_large = avatar_large
            //            对模型中的属性进行归档
            userAccount.saveUserAccount()
            
//          代码执行到此，表明用户登录成功，已经获取用户数据
            callBack(true)
        })
    }
}
